# 用列表list模拟栈

print("\n ######## 用列表list模拟栈 ########")
class Stack:
    def __init__(self):
        self.stack = []
    
    def pop(self):
        if self.stack.count == 0:
            print("stack is empty")
        else:
            self.stack.pop()
    
    def push(self,item):
        self.stack.append(item)

    def size(self):
        return len(self.stack)
    
    def peek(self):
        return self.stack[-1]
    
    def sort(self):
        return self.stack.sort()
    
    def print(self):
        print(self.stack)

    def remove(self,item):
        if self.stack.count(item) == 0:
            print("item not in stack")
        else:
            self.stack.remove(item)
stack = Stack()
stack.push(1)
stack.push(5)
stack.push(4)
stack.push(3)
stack.push(2)
stack.print()
stack.sort()
stack.print()
stack.pop()
stack.print()
print(stack.peek())
stack.print()
stack.remove(3)
stack.print()


print("\n ######## 用collections.deque 实现队列数据结构 ########")
# 用collections.deque 实现队列数据结构 ；它是双端队列，可以在两端高效地添加和删除元素。
# 使用 collections.deque 会更高效和简洁。它提供了 O(1) 时间复杂度的添加和删除操作;性能比列表模拟队列要好很多。


from collections import deque

queue = deque()
queue.append('a')
queue.append('b')
queue.append('c')
queue.append('d')
queue.append('e')

print(queue)
print(queue.popleft(),queue)
print(queue[0],queue)
print("队列长度：",len(queue))

print("\n ######## 用 列表list 模拟实现队列数据结构 ########")
class Queue:
    def __init__(self):
        self.queue = []

    def append(self,item):
        self.queue.append(item)
    
    def popLeft(self):
        if self.queue.count == 0:
            print("empty queue")
        else:
            self.queue = self.queue[1:]
    def popRight(self):
        if self.queue.count == 0:
            print("empty queue")
        else:
            self.queue = self.queue[0:-1]        
    def print(self):
        print(self.queue)


myQueue = Queue()
myQueue.append(1)
myQueue.append(2)
myQueue.append(5)
myQueue.append(4)
myQueue.append(3)
myQueue.print()
myQueue.popLeft()
myQueue.print()
myQueue.popRight()
myQueue.popRight()
myQueue.print()

print("\n ######## del语句 ########")
# 使用 del 语句可以从一个列表中根据索引来删除一个元素，而不是值来删除元素。
# 这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割，或清空整个列表
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
print(a)
del a[2:4]
print(a)
del a  # del 删除变量a 
# print(a) 会报错:  NameError: name 'a' is not defined

# pop() 移除并返回列表的最后一个元素
a = [-1, 1, 66.25, 333, 333, 1234.5]
a.pop()
print(a)


for i in reversed(range(1, 10, 2)):
    print(i,end=" ")
print()
basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
for i in sorted(set(basket)):
    print(i,end=" ")

print("\n","banana" in basket)

t = 12345, 54321, 'hello!'
print("\n",t)

# 构造函数 dict() 直接从键值对元组列表中构建字典
d = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)])
print(d)

# 如果关键字只是简单的字符串，使用关键字参数指定键值对有时候更方便：
d = dict(sape=4139, guido=4127, jack="4098")
print(d)

# 在字典中遍历时，关键字和对应的值可以使用 items() 方法同时解读出来：
knights = {'gallahad': 'the pure', 'robin': 'the brave'}
for k, v in knights.items():
     print(k, v)

# 在序列中遍历时，索引位置和对应值可以使用 enumerate() 函数同时得到：
for i, v in enumerate(['tic', 'tac', 'toe']):
     print(i, v)

# 同时遍历两个或更多的序列，可以使用 zip() 组合：
questions = ['name', 'quest', 'favorite color']
answers = ['lancelot', 'the holy grail', 'blue']
for q,a in zip(questions,answers):
    print('what is your {0} ? It is {1}'.format(q,a))

a=[1,2,3,4,5]
print(a[::-2])
print(a[::-1])